# #面向过程
# #面向对象
# #函数式编程
#
# #函数的使用必须通过调用
#
# #使用函数的好处？
# # 1、代码复用
# # 2、代码简洁
# # 3、维护方便
#
# #函数可以有返回值，也可以没有返回值
# #函数可以有多个返回值
# #函数碰到返回就退出
#
# # def stuinfo(name, age, sex):
# #     print(f"my name is {name},my age is {age},my sex is {sex}")
#
# def add(a,b):
#     return a+b,a-b
#
# #函数的调用
# # stuinfo("xxw", 20, "male")
#
# #return 退出函数，并且返回结果
# #函数可以有多个返回值
# #函数碰到返回就退出
#
# result = add(1, 2)
# print(result)
#
# #没有返回值，默认返回None
#
# #函数的参数传递
# #按照形参
#     #必选参数
#     #默认参数
#     #可变位置参数
#     #可变长关键字参数
#
# #按照实参
#
#
# #必选参数和默认参数
# def stuinfo(name, age, sex="fmale"):
#      print(f"my name is {name},my age is {age},my sex is {sex}")
#
# #位置参数
# stuinfo("sc",18,"male")
# #关键字参数
# stuinfo("sc",sex="boy",age=12)
#
#可变长位置参数
# def myargs(*nums):
#     print(nums)
#     print(type(nums))
#
# myargs()
# myargs(1)
# myargs(1,2)
# myargs(1,2,3)
# #
#可变长关键字参数
# def mykwargs(**nums):
#     print(nums)
#
# mykwargs(a=1)
# mykwargs(b=2, c=3)
#
# # * --> packing 、 unpacking
#
# # packing：
# # 形参传递 *nums --》1，2，3 --》（1，2，3）
# #        **nums --》a=1,b=2 -->{"a":1,"b":2}
#
# # 解包
# lst = [1, 2, "abc"]
# t1 = (2, 3, "tuple")
# print(lst)
# print(*lst)
# print(*t1)
#
# # **{"a"=1, "b"=2} -->a=1.b=2
# # d3=dict(d1,**d2)
#
# #python 参数传值    -->引用传递，但是python又有一个可变数据类型和不可变数据类型机制
# #所以对于不可变数据类型而言，他的表现形式像值传递（修改形参，不会影响原来的实参）
# #可变数据类型的传递 --》表现形式是引用传递（修改新参，会影响实参）
# def add(a,b):
#     a=200
#     print(f"a-id:{id(a)},b-id:{id(b)}")
#     return a+b
#
# x = 10
# y = 100
# print(f"x-id:{id(x)},y-id:{id(y)}")
# add(x,y)
#
# def changedata(lst):
#     print(f"lst1-id:{id(lst)}")
#     lst.append(1)
#
# lst1 = []
# changedata(lst1)
# print(f"lst1-id{id(lst1)}")
# print(lst1)
#
# #变量名的解析
# # LEGB
# # 1、本地作用域找 -- local
# # 2、在上层作用域找 -- enclosing
# # 3、在全局作用据中查找 -- global
# # 4、在内置作用域 -- builtin
# # x = 1
# # def func():
# #     x=2
# #     def func2():
# #         x=3
# #         print(x)
# #     func2()
# # func()
#
# # 匿名的函数
# # 没有名字的函数，通常函数体只有一个表达式
# func1 = lambda a, b: a+b
# print(func1(1, 2))
#
# lst = [1,2,3,]
# lst2 = [10,20,30]
# result = map( lambda x, y:x+y, lst, lst2)
# print(list(result))

##############递归函数
# 算法
# 自己调用自己
# 1、考虑一个大问题能不能通过查找规律，变成小问题
# 2、考虑递归的出口

# 求取n的阶乘
# n!=1*2*3....*n
# f(n) = n * f(n - 1)

# def jiecheng(n):
#     if n == 1:
#         return 1
#     return n * jiecheng(n-1)
# print(jiecheng(3))

# def taijie(n):
#     if n == 2 or n == 1:
#         return n
#     return taijie(n-1)+taijie(n-2)
# print(taijie(3))

# 在函数体里面定义全局变量
# a = 100
# def f():
#     global a #在函数体的里面声明和修改全局变量
#     a = 200
# f()
# print(a)

################文档注释
#文档注释是包、模块、函数里面第一个用三引号引起来的字符串
#一般放使用说明信息

# def func():
#     """
#     文档注释
#     this is func
#     :return: None
#     """
#     print("hello")
#
# print(help(func))
#
# print(help(input))
"""
builtins 主要是以下4方面
内建异常
内建变量
内建函数
工厂函数
"""
# import re
# def condition1(password):
#     if len(password) > 8:
#         return 1
#     else:
#         return 0
#
# def condition2(password):
#     flag = 0
#     if any(c.isdigit() for c in password):
#         flag += 1
#     if any(c.isupper() for c in password):
#         flag += 1
#     if any(c.islower() for c in password):
#         flag += 1
#     if any(not c.isalnum() for c in password):
#         flag += 1
#     return flag
#
# def condition3(password):
#     if len(password) < 6:
#         return 1
#     else:d
#         for i in range(len(password)-5):
#             if password[i:i+3] in password[i+2:]:
#                 return 0
# password = input("请输入密码：")
# str = []
# num1 = condition1(password)
# num2 = condition2(password)
# num3 = condition3(password)
# scord = 2
# if num1 == 0:
#     str.append("长度小于8")
# else:
#     scord +=1
# if num2 < 3:
#     str.append("密码没有由3种以上字符组成")
# else:
#     scord += 1
# if num3 == 0:
#     str.append("密码有长度大于3的字串")
# else:
#     scord += 1
# if len(str) > 0:
#     print(f"return {scord},{str}")
# else:
#     print(f"return {scord}")


# lst = [0,0,0,0]
# def func2(passwd):
#     for i in passwd:
#         if sum(lst)>=3:
#             break
#         else:
#             if i.isupper():
#                 lst[0] = 1
#             elif i.islower():
#                 lst[1] = 1
#             elif i.isdigit():
#                 lst[2] = 1
#             else:
#                 lst[3] = 1
#     return lst




